|
===================================== 〔語彙分解〕的な部分一致の検索結果は以下の通りです。 ・ 共 : [ども] 1. (suf) indicates plural - humble referring to oneself, disdainful referring to others ・ 変 : [へん] 1. (adj-na,n) change 2. incident 3. disturbance 4. strange 5. flat (music) 6. odd 7. peculiar 8. suspicious-looking 9. queer 10. eccentric 1 1. funny 1 ・ 変性 : [へんせい] 1. (n,vs) denature 2. degenerate ・ 反 : [はん, たん] 1. (n,vs,n-pref) anti- 2. opposite 3. antithesis 4. antagonism ・ 反変 : [はんぺん] (n) (gen) (math) contravariant ・ 計 : [けい] 1. (n,n-suf) plan ・ 計算 : [けいさん] 1. (n,vs) (1) calculation 2. reckoning 3. count 4. (2) forecast ・ 計算機 : [けいさんき] 【名詞】 1. computer 2. calculator ・ 機 : [き, はた] (n) loom ・ 科 : [か] 1. (n,n-suf) department 2. section ・ 科学 : [かがく] 【名詞】 1. science ・ 学 : [がく] 【名詞】 1. learning 2. scholarship 3. erudition 4. knowledge
プログラミング言語の型システムにおける共変性と反変性(きょうへんせいとはんぺんせい)とは、特定の状況下 (引数や総称型、戻り値など) において、型を狭いものから広いものの順に順序づけたとき、それらの間に互換性すなわち同等性があることをいう: * 共変 (): 広い型(例:)から狭い型(例:)へ変換すること。 * 反変 () : 狭い型(例:)から広い型(例:)へ変換すること。 * 不変 (): 型を変換できないこと。 例えば、取り得る値が である型は、取り得る値が しかない型より広い。よって、型変換 -> (double 型の値を float 型を期待している関数に渡した場合など) は共変変換である。同様に、型変換 -> (float を返す関数を double を返す関数の代わりに呼び出した場合など) は関数の反変変換である (関数の型は戻り値の型)。 複数の同等でない型が、同一の値を取り得ることに注意すること。例えば、取り得る値が である型と である型は互いに同等でないが、取り得る値が である型とは、それぞれ -> および -> となり、いずれも同等である。 クラスにおける型の同等性は、継承の階層関係によって暗黙的に示される (そしてこれこそが、継承を行う正当な理由である)。しかしながら、派生クラスでの変更によってはこの表明に違反する可能性があるため、プログラミング言語のなかには、特定の状況下でのこの暗黙の同等性に関する前提を限定するものもある。例えば、C# 3.0 の総称型パラメータは共変性も反変性もサポートしていない。IEnumerable ==形式的定義== プログラミング言語の型システムにおいて、型変換演算子が、 * 型の順序関係を維持する (≤ で順序づけたとき、特殊から一般の順になる) とき、共変である (covariant) という。 * 型の順序関係を反転させる (≤ で順序づけたとき、一般から特殊の順になる) とき、反変である (contravariant) という。 * 上記いずれにも該当しないとき、不変である (invariant) という。 これらの用語は数学の圏論に由来する。圏論では共変性と反変性をより一般的に定義しており、コンピューター科学におけるこれらの用語の定義は、圏論におけるベクトル空間上での定義と同じである。 この区分は、クラス階層におけるメソッドの引数および戻り値の型を検討するときに重要である。C++のようなオブジェクト指向言語においては、クラス ''B'' がクラス ''A'' の派生型であるとき、''B'' のメンバー関数はいずれも、戻り値の型集合が ''A'' のものと同じかより小さくなければならない。すなわち戻り値の型は共変である。一方、''B'' のメンバー関数のとりうる引数の型集合が、''A'' のものと同じかより大きいとき、引数の型は反変である。''B'' のインスタンスにとって問題なのは、どうすれば ''A'' のインスタンスを完全に置換可能かということである。型安全性と置換可能性を保証する唯一の方法は、入力に対しては ''A'' と同等かより寛容に、出力に対しては ''A'' と同等かより厳格に振る舞うことである。ただし、すべてのプログラミング言語があらゆる文脈でこの2つの性質を保証しているわけではなく、不必要に厳格なものもある。つまり、特定の文脈においては共変性や反変性をサポートしないことがある。 典型的な例を示す: * 要素型から配列型を構築する演算子は、通常、基本型に対し共変である。すなわち ''String'' ≤ ''Object'' ならば ''ArrayOf(String)'' ≤ ''ArrayOf(Object)'' である。ただしこれは配列がイミュータブルである場合に限って正しい (型安全である)。配列に対する追加演算子 (要素を配列に追加する) と取出演算子 (要素を配列から取り出す) が許される場合、追加演算子は共変 (例えば ''String'' を ''ArrayOf(Object)'' に追加できる) であるのに対し、取出演算子は反変 (例えば ''ArrayOf(String)'' から ''Object'' を取り出せる) である。このように共変性と反変性が競合するため、ミュータブルな配列は基本型に対して不変にすべきである。 * ''T'' 型の引数を持つ関数呼び出し (''fun f'' (''x : T'') : ''Integer'' と定義) は、''T'' ≤ ''S'' のとき、''fun g''(''x: S'') : ''Integer'' と定義される関数 ''g'' で置換可能である。言い換えると、''g'' は、引数の型に関して ''f'' より寛容であり、''f'' と同様に ''Integer'' を返すので、''f'' をいつでも置換できる。このように、関数引数を許す言語においては、 ''g'' ≤ ''f'' と ''f'' の引数の型とは反変である。 * 一般的に、結果の型は共変である。 オブジェクト指向プログラミングにおいては、サブクラスでメソッドをオーバーライドした場合、置換が暗黙的に行われる。すなわち、元のコードで古いメソッドを呼び出すと、新しいメソッドが代わりに実行される。どのような形式のオーバーライドを許容するか、オーバーライドされたメソッドの型がどのように変化するかは、プログラム言語によって様々である。 抄文引用元・出典: フリー百科事典『 ウィキペディア(Wikipedia)』 ■ウィキペディアで「共変性と反変性 (計算機科学)」の詳細全文を読む スポンサード リンク
|